package refunds

import (
	"jlpay-sdk-go/pkg/jlpay/core"
	"jlpay-sdk-go/pkg/jlpay/models"
)

// ==================== 退款申请请求 ====================

// RefundsRequest 退款申请请求
type RefundsRequest struct {
	models.OrgBaseRequest
	// MchID 商户号
	MchID string `json:"mch_id,omitempty"`
	// OutTradeNo 外部订单号
	OutTradeNo string `json:"out_trade_no,omitempty"`
	// OriOutTradeNo 原外部订单号
	OriOutTradeNo string `json:"ori_out_trade_no,omitempty"`
	// OriTransactionID 原平台订单号
	OriTransactionID string `json:"ori_transaction_id,omitempty"`
	// TotalFee 交易金额
	TotalFee string `json:"total_fee,omitempty"`
	// Remark 备注
	Remark string `json:"remark,omitempty"`
	// MchCreateIP 终端IP
	MchCreateIP string `json:"mch_create_ip,omitempty"`
	// Longitude 经度
	Longitude string `json:"longitude,omitempty"`
	// Latitude 纬度
	Latitude string `json:"latitude,omitempty"`
	// NotifyURL 推送地址
	NotifyURL string `json:"notify_url,omitempty"`
	// 原始请求映射数据
	rawRequestMap map[string]interface{} `json:"-"`
}

// NewRefundsRequest 创建退款申请请求
func NewRefundsRequest() *RefundsRequest {
	return &RefundsRequest{}
}

// SetMchID 设置商户号
func (r *RefundsRequest) SetMchID(mchID string) *RefundsRequest {
	r.MchID = mchID
	return r
}

// SetOutTradeNo 设置外部订单号
func (r *RefundsRequest) SetOutTradeNo(outTradeNo string) *RefundsRequest {
	r.OutTradeNo = outTradeNo
	return r
}

// SetOriOutTradeNo 设置原外部订单号
func (r *RefundsRequest) SetOriOutTradeNo(oriOutTradeNo string) *RefundsRequest {
	r.OriOutTradeNo = oriOutTradeNo
	return r
}

// SetOriTransactionID 设置原平台订单号
func (r *RefundsRequest) SetOriTransactionID(oriTransactionID string) *RefundsRequest {
	r.OriTransactionID = oriTransactionID
	return r
}

// SetTotalFee 设置交易金额
func (r *RefundsRequest) SetTotalFee(totalFee string) *RefundsRequest {
	r.TotalFee = totalFee
	return r
}

// SetRemark 设置备注
func (r *RefundsRequest) SetRemark(remark string) *RefundsRequest {
	r.Remark = remark
	return r
}

// SetMchCreateIP 设置终端IP
func (r *RefundsRequest) SetMchCreateIP(mchCreateIP string) *RefundsRequest {
	r.MchCreateIP = mchCreateIP
	return r
}

// SetLongitude 设置经度
func (r *RefundsRequest) SetLongitude(longitude string) *RefundsRequest {
	r.Longitude = longitude
	return r
}

// SetLatitude 设置纬度
func (r *RefundsRequest) SetLatitude(latitude string) *RefundsRequest {
	r.Latitude = latitude
	return r
}

// SetNotifyURL 设置推送地址
func (r *RefundsRequest) SetNotifyURL(notifyURL string) *RefundsRequest {
	r.NotifyURL = notifyURL
	return r
}

// SetRawRequestMap 设置原始请求映射数据
func (r *RefundsRequest) SetRawRequestMap(rawMap map[string]interface{}) *RefundsRequest {
	r.rawRequestMap = rawMap
	return r
}

// GetRawMap 获取原始映射数据
func (r *RefundsRequest) GetRawMap() (map[string]interface{}, bool) {
	return r.rawRequestMap, r.rawRequestMap != nil
}

// ToMap 转换为map
func (r *RefundsRequest) ToMap() (map[string]interface{}, error) {
	// 如果有原始映射数据，直接返回
	if rawMap, exists := r.GetRawMap(); exists {
		return rawMap, nil
	}

	// 构建基础请求数据
	requestMap := make(map[string]interface{})

	// 添加基础字段
	if r.MchID != "" {
		requestMap["mch_id"] = r.MchID
	}
	if r.OutTradeNo != "" {
		requestMap["out_trade_no"] = r.OutTradeNo
	}
	if r.OriOutTradeNo != "" {
		requestMap["ori_out_trade_no"] = r.OriOutTradeNo
	}
	if r.OriTransactionID != "" {
		requestMap["ori_transaction_id"] = r.OriTransactionID
	}
	if r.TotalFee != "" {
		requestMap["total_fee"] = r.TotalFee
	}
	if r.Remark != "" {
		requestMap["remark"] = r.Remark
	}
	if r.MchCreateIP != "" {
		requestMap["mch_create_ip"] = r.MchCreateIP
	}
	if r.Longitude != "" {
		requestMap["longitude"] = r.Longitude
	}
	if r.Latitude != "" {
		requestMap["latitude"] = r.Latitude
	}
	if r.NotifyURL != "" {
		requestMap["notify_url"] = r.NotifyURL
	}

	// 合并基础请求数据
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	for k, v := range baseMap {
		requestMap[k] = v
	}

	return requestMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *RefundsRequest) CheckRequiredParams(config *core.Config) error {
	return r.OrgBaseRequest.CheckRequiredParams(config)
}

// ==================== 退款申请响应 ====================

// RefundsResponse 退款申请响应
type RefundsResponse struct {
	models.StandardResponse
	// Status 状态 1：待确认 2：成功 3：失败
	Status string `json:"status,omitempty"`
	// MchID 商户号
	MchID string `json:"mch_id,omitempty"`
	// TransactionID 平台订单号
	TransactionID string `json:"transaction_id,omitempty"`
	// OutTradeNo 外部订单号
	OutTradeNo string `json:"out_trade_no,omitempty"`
	// ChnTransactionID 渠道订单号
	ChnTransactionID string `json:"chn_transaction_id,omitempty"`
	// OriOutTradeNo 原外部订单号
	OriOutTradeNo string `json:"ori_out_trade_no,omitempty"`
	// OriTransactionID 原平台订单号
	OriTransactionID string `json:"ori_transaction_id,omitempty"`
	// TotalFee 交易金额
	TotalFee interface{} `json:"total_fee,omitempty"`
	// PayType 交易类型
	PayType string `json:"pay_type,omitempty"`
	// TransTime 交易时间
	TransTime string `json:"trans_time,omitempty"`
	// SuccessTime 退款完成时间
	SuccessTime string `json:"success_time,omitempty"`
}

// NewRefundsResponse 创建退款申请响应
func NewRefundsResponse() *RefundsResponse {
	return &RefundsResponse{}
}
